/**
 * 事件总线 EventBus
 * 用于组件间通信
 * @module utils/eventBus
 * @author 互成一家
 * @description 提供组件间事件发布订阅功能
 */
import { reactive } from 'vue';

// 事件字典
export const EventTypes = {
  /** 刷新服务列表 */
  REFRESH_SERVICE_LIST: 'refresh_service_list',
  /** 刷新评价列表 */
  REFRESH_REVIEW_LIST: 'refresh_review_list',
  /** 订单状态变更 */
  ORDER_STATUS_CHANGED: 'order_status_changed',
  /** 评价提交成功 */
  REVIEW_SUBMITTED: 'review_submitted',
  /** 支付完成 */
  PAYMENT_COMPLETED: 'payment_completed',
  /** 服务收藏状态变更 */
  SERVICE_FAVORITE_CHANGED: 'service_favorite_changed'
};

class EventBus {
  constructor() {
    this.events = {};
  }
  
  /**
   * 订阅事件
   * @param {string} eventName - 事件名称
   * @param {Function} callback - 回调函数
   * @returns {Function} 取消订阅的函数
   */
  on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
    
    // 返回一个取消订阅的函数
    return () => {
      this.off(eventName, callback);
    };
  }
  
  /**
   * 取消订阅
   * @param {string} eventName - 事件名称
   * @param {Function} callback - 需要移除的回调函数
   */
  off(eventName, callback) {
    if (!this.events[eventName]) return;
    
    if (callback) {
      this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);
    } else {
      delete this.events[eventName];
    }
  }
  
  /**
   * 触发事件
   * @param {string} eventName - 事件名称
   * @param {any} data - 事件数据
   */
  emit(eventName, data) {
    if (!this.events[eventName]) return;
    
    this.events[eventName].forEach(callback => {
      try {
        callback(data);
      } catch (error) {
        console.error(`EventBus 事件 ${eventName} 处理错误:`, error);
      }
    });
  }
  
  /**
   * 只订阅一次
   * @param {string} eventName - 事件名称
   * @param {Function} callback - 回调函数
   */
  once(eventName, callback) {
    const onceCallback = (data) => {
      callback(data);
      this.off(eventName, onceCallback);
    };
    
    this.on(eventName, onceCallback);
  }
  
  /**
   * 清除所有事件
   */
  clear() {
    this.events = {};
  }
}

// 创建全局事件总线实例
const eventBus = new EventBus();

export default eventBus;
